package club.hicode.daydayup.proxy.java;

import club.hicode.daydayup.proxy.IRunable;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理的测试
 *
 * @author Liu Chunfu
 * @date 2018-05-03 上午10:12
 **/
public class MyProxyTest {

    IRunable runable = new PersonRunable();

    @Test
    public void test1() {

        IRunable proxy = (IRunable) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{IRunable.class}, new InvocationHandler() {
            /**
             * 动态代理要做的事情
             * @param proxy 代理类
             * @param method 代理的方法，可以理解为接口
             * @param args 参数
             * @return 代理对象，切记一定要使用代理对象进行操作
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println(proxy.getClass());
                System.out.println("before");
                //此处是反射调用方法：第一个参数是具体的执行类，第二参数是参数。
                return method.invoke(runable, args);
            }
        });

        proxy.say();
    }

    @Test
    public void test2() {
        GPProxy proxy = new GPProxy(runable);

        IRunable proxy1 = proxy.getProxy();
        proxy1.say();
    }
}
